<?php
/**
 * Created by Zhy
 * User: Zhy
 * Date: 2018/6/13
 * Time: 11:21
 */

namespace app\api\controller;


use think\Db;
use app\common\model\Article as ArticleModel;
use app\common\model\ArticleSon as ArticleSonModel;
use app\common\model\User as UserModel;
use app\common\model\Areas as AreasModel;

class Publish extends \app\api\controller\Base
{
    //判断已读、未读、清空消息的字符串
    protected $str = ',0,';
    
    /**
     * 根据用户选择发布的类型，判断是否有精准发布权限，没有则跳转购买页面
     * article_type:消息分类    1.帮帮  2.走失  3.福利  4.悬赏
     * publish_type:发布分类    1.普通发布  2.精准发布
     */
    public function judgeAuth()
    {
        $params = input('param.');
        $auth = $this->checkAll($params['user_id'], $params['time'], $params['value'], $params['reqKey']);
        if($auth == false) {
            $this->apiError(301);
        }
        /*** 24小时内是否有发布过同类的消息 普通发布1次  铜牌发布1次  银牌发布3次   金牌发布3次 ***/
        if($params['publish_type'] == 1){//普通发布
            $allowTime = $this->published($params['user_id'], $params['article_type'], 1);
            if($allowTime != -1) {
                if(time() < $allowTime) {
                    return $this->apiError(4002, '24小时内不允许发布相同类型的普通消息');
                }
            }
        }
        $data = $this->userAuthType($params['user_id']);
        $time1 = date('Y-m-d H:i:s');
        $time2 = date('Y-m-d H:i:s', strtotime('-1 day'));
        //是否是精准发布
        if($params['publish_type'] == 2) {
            $result = Db::name('user_auth')->where('uauth_user_id', $params['user_id'])->select();
            //是否购买过权限
            if(!$result) {
                return $this->apiError('E907');
            }
            //权限是否到期
            $status = 1;//1表示所有权限已过期  如果有任意一个会员结束时间大于当前时间，说明有权限，status置0
            foreach($result as $res) {
                if(strtotime($res['uauth_end']) > strtotime(date('Y-m-d'))) {
                    $status = 0;
                }else{//已过期的记录，将up_user_auth表uauth_status字段设置为2
                    Db::name('user_auth')->where('uauth_id', $res['uauth_id'])->setField('uauth_status', 2);
                }
            }
            if($status == 1) {
                return $this->apiError(4001, '您购买的权限已到期，请重新购买');
            }
            if(in_array(2,$data)){//如果用户有铜牌发布权限
                $allowTime = $this->published($params['user_id'], $params['article_type'], 2);
                if($allowTime != -1) {
                    if(time() < $allowTime) {//如果距离上次发布时间没有24小时，则删除该用户权限数组中的该权限
                        unset($data[0]);
                        $data = array_values($data);
                    }
                }
            }
            if(in_array(3,$data)){//如果用户有银牌发布权限
                $count = $this->publishedT($params['user_id'], $params['article_type'], 3, $time2, $time1);
                if($count == 3) {//24小时内已经发布了3条
                    $k = array_search(3, $data);
                    unset($data[$k]);
                    $data = array_values($data);
                }
            }
            if(in_array(4,$data)){//如果用户有金牌发布权限
                $count = $this->publishedT($params['user_id'], $params['article_type'], 4, $time2, $time1);
                if($count == 3) {//24小时内已经发布了3条
                    $k = array_search(4, $data);
                    unset($data[$k]);
                    $data = array_values($data);
                }
            }
            if(empty($data)){
                return $this->apiError(1, '您24小时内该类型的消息发布次数已用完，请稍后再发布');
            }
        }
        if($params['publish_type'] == 1){
            unset($data);
            $data[] = 1;
        }
        return $this->apiSuccess($data);
    }
    
    /**
     * 用户发布消息
     * a_title:消息标题
     * a_content：消息内容
     * a_sheng：当前定位省份ID
     * a_shi：当前定位城市ID
     * a_auth_city：发布消息时选择的省/市ID
     * a_phone：发布消息时的手机号码
     * a_image：消息图片       以逗号隔开的字符串
     * a_type:信息分类         1.帮帮  2.走失  3.福利  4.悬赏
     * a_auth_type:权限分类    1.普通  2.铜牌  3.银牌  4.金牌
     */
    public function userPublish()
    {
        $params = input('param.');
        $auth = $this->checkAll($params['user_id'], $params['time'], $params['value'], $params['reqKey']);
        if($auth == false) {
            $this->apiError(301);
        }
        if($params['a_auth_type'] == 1 || $params['a_auth_type'] == 2){//普通发布或铜牌发布
            $allowTime = $this->published($params['user_id'], $params['a_type'], $params['a_auth_type']);
            if($allowTime != -1) {
                if(time() < $allowTime) {
                    return $this->apiError(4002, '24小时内不允许发布相同类型的普通消息');
                }
            }
        }
        $time1 = date('Y-m-d H:i:s');
        $time2 = date('Y-m-d H:i:s', strtotime('-1 day'));
        if($params['a_auth_type'] == 3 || $params['a_auth_type'] == 4){//银牌发布或金牌发布
            $count = $this->publishedT($params['user_id'], $params['a_type'], $params['a_auth_type'], $time2, $time1);
            if($count == 3) {//24小时内已经发布了3条
                return $this->apiError(1, '您24小时内该类型的消息发布次数已用完，请稍后再发布');
            }
        }
        //表单验证
        if($params['a_title'] == ''){
            return $this->apiError(14001, '标题不能为空');
        }
        if($params['a_content'] == ''){
            return $this->apiError(14001, '内容不能为空');
        }
        if($params['a_phone'] == '' || !preg_match("/^1[345678]{1}\d{9}$/",$params['a_phone'])){
            return $this->apiError(14001, '填写正确的手机号码');
        }
        if($params['a_type'] == ''){
            return $this->apiError(14001, '请选择消息类型');
        }
        if($params['a_image'] == ''){
            return $this->apiError(14001, '请选择图片');
        }
        
        $params['a_title'] = trim($params['a_title']);//消息标题
        $params['a_user_id'] = $params['user_id'];//用户id
        //如果是金牌权限发布或普通发布，则a_auth_city置0
        if($params['a_auth_type'] == 4) {
            $this->attestationed($params['user_id']);//判断用户是否已经认证 金牌发布
            $params['a_auth_city'] = 0;
        } elseif($params['a_auth_type'] == 3) {
            $this->attestationed($params['user_id']);//判断用户是否已经认证 银牌发布
        } elseif($params['a_auth_type'] == 1) {
            $params['a_auth_city'] = 0;
        }
        $params['a_createtime'] = date('Y-m-d H:i:s', time());//消息发布时间
        $params['a_image'] = trim($params['a_image'], ',');//消息图片
        $params['a_year'] = date('Y', time());//发布消息年份
        $params['a_phone'] = trim($params['a_phone']);//手机号码
        $articleModel = new ArticleModel();
        $res = $articleModel->creatArticle($params);
        if($res) {
            $as_article_id = $articleModel->a_id;//获取新增记录id
            $data = [
                'as_article_id' => $as_article_id,
                'as_time' => $params['a_createtime'],
                'as_read_users' => $this->str,
                'as_clear_users' => $this->str,
            ];
            $time = date('Y-m-d');
            if(mb_strlen($params['a_title'], 'utf8') > 10){
                $title = mb_substr($params['a_title'], 0, 10, 'utf-8') . '......';
            }else{
                $title = $params['a_title'];
            }
            $lists = [];
            $userModel = new UserModel();
            //如果是铜牌发布，则需在a_article_son中插入一条数据，并进行推送
            if($params['a_auth_type'] == 2) {
                $num = $this->publishFollow($data, $time);
                if($num < 10) {
                    $list = $userModel->getPushUser('user_shi', $params['a_auth_city']);
                    if($list){
                        foreach($list as $val){
                            $va = (string)$val;
                            array_push($lists, $va);
                        }
                        //推送 参数1.被推送的用户 数组  2.标识  3.推送的方式  4.推送内容 数组
                        $this->Jpush($lists, $title, 1, ['type'=>1]);
                        //推送记录表，推送次数自增1
                        Db::name('pushnum')->where('pushtime', $time)->setInc('pushnum');
                    }
                }
            }
            //如果是银牌发布，则需在a_article_son中插入一条数据，并进行推送
            if($params['a_auth_type'] == 3) {
                $num = $this->publishFollow($data, $time);
                if($num < 10) {
                    $list = $userModel->getPushUser('user_sheng', $params['a_auth_city']);
                    if($list){
                        foreach($list as $val){
                            $va = (string)$val;
                            array_push($lists, $va);
                        }
                        $this->Jpush($lists, $title, 1, ['type'=>1]);
                        Db::name('pushnum')->where('pushtime', $time)->setInc('pushnum');
                    }
                }
            }
            //如果是金牌发布，则需在a_article_son中插入一条数据，并进行推送
            if($params['a_auth_type'] == 4) {
                $num = $this->publishFollow($data, $time);
                if($num < 10) {
                    $this->Jpush('', $title, 2, ['type'=>1]);
                    Db::name('pushnum')->where('pushtime', $time)->setInc('pushnum');
                }
            }
            return $this->apiSuccess();
        } else {
            return $this->apiError(4004, '发布失败');
        }
    }
    
    /**
     * 获取省份和市的三维数组
     * @return \think\response\Json
     */
    public function getArea(){
        $list = AreasModel::getShengShi();
        return $this->apiSuccess($list);
    }
    
    /**
     * 获取用户的权限种类及数量
     * @param $user_id
     * @return array
     */
    private function userAuthType($user_id)
    {
        $date = date('Y-m-d', time());
        $auth = Db::name('user_auth')
            ->where('uauth_user_id', $user_id)
            ->where('uauth_end', '>', $date)
            ->order('uauth_type')
            ->column('distinct(uauth_type)');
        return $auth;
    }
    
    /**
     * 判断用户是否已经认证
     * @param $user_id
     */
    private function attestationed($user_id)
    {
        $userModel = new UserModel();
        $attestation = $userModel->isAttestation($user_id);
        if($attestation != 2) {
            return $this->apiError(4003, '请先进行认证');
        }
    }
    
    /**
     * 获取当天推送的消息条数
     * @return mixed
     */
    private function getPushNum($time)
    {
        $nums = Db::name('pushnum')->where('pushtime', $time)->value('pushnum');
        return $nums;
    }
    
    /**
     * 发布成功后的后续操作  1.插入a_article_son表
     *                     2.查询up_pushnum表中是否有当天推送的记录，如果没有创建记录
     * @param $data
     * @param $time
     */
    private function publishFollow($data, $time)
    {
        $articleSonModel = new ArticleSonModel();
        $articleSonModel->createRow($data);
        $num = $this->getPushNum($time);
        //如果没有记录，则先创建一条记录
        if($num === null) {
            Db::name('pushnum')->insert(['pushtime' => $time]);
        }
        return $num;
    }
    
    /**
     * 判断该用户在24小时内是否有发布过同类的消息  普通发布和铜牌发布
     * @param $user_id
     * @param $article_type
     * @param $auth   发布权限
     * @return false|int
     */
    private function published($user_id, $article_type, $auth)
    {
        $where['a_user_id'] = $user_id;
        $where['a_type'] = $article_type;
        $where['a_auth_type'] = $auth;
        $articleModel = new ArticleModel();
        $createtime = $articleModel->isPublished($where);
        
        if($createtime) {//有createtime表示有发布记录
            $lastCreateTime = strtotime($createtime[0]);
            //获取最后一条发布记录时间，一天后的24小时后的时间戳
            $allowTime = strtotime("+1 day", $lastCreateTime);
        } else {
            $allowTime = -1;
        }
//        print_r($allowTime);die;
        return $allowTime;
    }
    
    /**
     * 判断该用户在24小时内是否有发布过同类的消息  银牌发布和金牌发布
     * @param $user_id   用户ID
     * @param $article_type   发布的类型
     * @param $auth   发布权限
     * @param $startTime   开始时间
     * @param $endTime   结束时间
     * @return false|int
     */
    private function publishedT($user_id, $article_type, $auth, $startTime, $endTime)
    {
        $where['a_user_id'] = $user_id;
        $where['a_type'] = $article_type;
        $where['a_auth_type'] = $auth;
        $count = Db::table('up_article')
            ->where($where)
            ->whereTime('a_createtime', 'between', [$startTime, $endTime])
            ->count('a_id');
        return $count;
    }
}